import type { ButtonProps } from "@/components/Button"
import type { VisibleProps, DisbaledProps, PermissionProps } from "@/components/hooks"
import { CustomQueryProps } from "@/components/hooks/custom-query"
import type { InputComponentType, InputProps } from "@/components/Input"
import { ComponentCommonMethods } from "@/components/types"
import type { FormItemRule, FormValidationError } from "naive-ui"

export * from "@/components/Button/src/types"

/**
 * 表单配置
 */
export interface FormProps {
    // 大小
    size?: "small" | "medium" | "large"
    // 行内表单
    inline?: boolean
    // 标签宽度
    labelWidth?: string | number | "auto"
    // 标签文本对齐方式
    labelAlign?: "left" | "right"
    // 标签显示位置
    labelPlacement?: "left" | "top"
    // 标签是否显示
    labelShow?: boolean
    // 是否显示校验反馈
    showFeedback?: true
    // 子项
    items: FormItemProps[]
    // 是否使用表格
    useGrid?: boolean
    // 一行显示多少列
    cols?: number | string
    // 每两个子项间间隔
    gap?: number | string

    // 是否查询表单
    search?: boolean | SearchFormProps
}

/**
 * 查询表单属性
 */
export interface SearchFormProps {
    // 查询按钮
    searchBtn?: boolean | Partial<ButtonProps>
    // 重置按钮
    resetBtn?: boolean | Partial<ButtonProps>
    // 是否使用高级查询
    useAdvance?: boolean
    // 高级查询显示行数
    advanceRows?: number
}

/**
 * 表单子项配置
 */
export interface FormItemProps
    extends PermissionProps,
        VisibleProps,
        Omit<InputProps, "property" | "type">,
        Omit<CustomQueryProps, "property"> {
    // 显示名
    property: string
    // 类型
    type: Component | InputComponentType | "hidden"
    // 大小
    size?: "small" | "medium" | "large"
    // 路径
    path?: string
    // 显示名
    label?: string
    // 标签宽度
    labelWidth?: string | number | "auto"
    // 标签文本对齐方式
    labelAlign?: "left" | "right"
    // 标签显示位置
    labelPlacement?: "left" | "top"
    // 标签是否显示
    labelShow?: boolean
    // 是否显示校验反馈
    showFeedback?: true

    // 默认值
    defaultValue?: any
    // 校验规则
    rules?: FormItemRule | FormItemRule[]

    // 栅格占据的列数，为 0 的时候会隐藏
    span?: number | string
    // 栅格左侧的间隔格数
    offset?: number | string
}

/**
 * 表单支持的调用方法
 */
export interface FormMethods {
    validate: (cb?: (errors?: FormValidationError[]) => void) => Promise<any>
    clearValidate: () => void
    getFormData: () => Recordable<any>
    setFormData: (data: Recordable) => void
    setFormItemData: (data: Recordable) => void
    setDefaultFormData: (data: Recordable) => void
    resetForm: () => void
}

export interface FormMethodsLocal extends FormMethods, ComponentCommonMethods<FormProps> {}
